﻿#region License

// Copyright (c) 2011, Matt Holmes
// All rights reserved.
// 
// Redistribution and use in source and binary forms, with or without modification, are permitted provided 
// that the following conditions are met:
// 
// * Redistributions of source code must retain the above copyright notice, this list of conditions and the 
//   following disclaimer.
// * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and
//   the following disclaimer in the documentation and/or other materials provided with the distribution.
// 
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED 
// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A 
// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR 
// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED 
// TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 
// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 
// OF THE POSSIBILITY OF SUCH DAMAGE.

#endregion

using System.Windows.Input;
using Microsoft.Practices.Prism.Commands;
using Microsoft.Practices.Prism.ViewModel;
using SkyrimTweaker.Common;
using SkyrimTweaker.Common.Services;

namespace SkyrimTweaker.Plugins.Tweaks {
	public interface ITweaksViewModel {
		ICommand CancelCommand { get; }
		SkyrimData Data { get; }
		ICommand SaveCommand { get; }
		ICommand ShowWaterPopupCommand { get; }
		string Title { get; }
		ITweaksView View { get; set; }
	}

	internal class TweaksViewModel : NotificationObject, ITweaksViewModel {
		#region Fields

		private readonly IIniService _iniService;
		private DelegateCommand _cancelCommand;
		private DelegateCommand _saveCommand;
		private ICommand _showWaterPopupCommand;
		private ITweaksView _view;

		#endregion

		#region Constructors

		public TweaksViewModel (IIniService iniService) {
			_iniService = iniService;
			_iniService.DataDirtyChanged += (o, e) => {
				((DelegateCommand) SaveCommand).RaiseCanExecuteChanged ();
				((DelegateCommand) CancelCommand).RaiseCanExecuteChanged ();
			};
		}

		#endregion

		#region Private Methods

		private void ExecuteCancel () {
			_iniService.LoadIniFile ();
			RaisePropertyChanged (() => Data);
		}

		private void ExecuteSave () {
			_iniService.SaveIniFile ();
		}

		private void ExecuteShowWaterPopup () {
			_view.ToggleWaterPopup ();
		}

		#endregion

		#region ITweaksViewModel Members

		public ITweaksView View {
			get { return _view; }
			set { _view = value; }
		}

		public string Title {
			get { return "Tweaks"; }
		}

		public ICommand CancelCommand {
			get { return _cancelCommand ?? (_cancelCommand = new DelegateCommand (ExecuteCancel, () => _iniService.LoadedData.IsDirty)); }
		}

		public SkyrimData Data {
			get { return _iniService.LoadedData; }
		}

		public ICommand SaveCommand {
			get { return _saveCommand ?? (_saveCommand = new DelegateCommand (ExecuteSave, () => _iniService.LoadedData.IsDirty)); }
		}

		public ICommand ShowWaterPopupCommand {
			get { return _showWaterPopupCommand ?? (_showWaterPopupCommand = new DelegateCommand (ExecuteShowWaterPopup)); }
		}

		#endregion
	}
}
